package main

import (
	"fmt"
	// "time"
)

func main() {
	// name:="飞雪无情"
	// nameP:=&name
	// fmt.Println("name变量的值为：",name)
	// fmt.Println("name变量的内存地址为：",namep)

	// 指针取值
	// nameV:=*nameP
	// fmt.Println("name:" , nameV)

	// 修改
	// *nameP="呵呵你好啊"
	// fmt.Println("nameP:",*nameP)
	// fmt.Println("name:",name)

	// 声明一个指针
	// var intP *int
	// var intP *int = new(int)
	// 推荐
	// intP:=new(int)
	// *intP=10
	// // new函数分配一块内存

	// fmt.Println(intP)

	age := 17
	modifyAge(&age)
	fmt.Println("age:", age)

	var a int
	fmt.Println(&a)
	var p *int
	p = &a
	*p = 20
	fmt.Println(a)

}

// 指针参数
func modifyAge(age *int) {
	*age = 20
}

/*
	不要对 map、slice、channel 这类引用类型使用指针；

	如果需要修改方法接收者内部的数据或者状态时，需要使用指针；

	如果需要修改参数的值或者内部数据时，也需要使用指针类型的参数；

	如果是比较大的结构体，每次参数传递或者调用方法都要内存拷贝，内存占用多，这时候可以考虑使用指针；

	像 int、bool 这样的小数据类型没必要使用指针；

	如果需要并发安全，则尽可能地不要使用指针，使用指针一定要保证并发安全；

	指针最好不要嵌套，也就是不要使用一个指向指针的指针，虽然 Go 语言允许这么做，但是这会使你的代码变得异常复杂。
*/
